package cn.miao.simple;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.nio.charset.StandardCharsets;
import java.util.HashMap;

/**
 * @program: QuickStart-RabbitMQ
 * @description: 生产者
 * @author: MiaoWei
 * @create: 2021-10-19 18:28
 **/
public class Producer {

    public static void main(String[] args) {
        //所有的中间件技术都是基于tcp/ip协议基础之上构建新型的协议规范,只不过rabbitMQ遵循的是AMQP协议
        //为什么有AMQP协议:就是因为TCP/IP协议无法去满足它的一些规范,比如我要把这消息的一些标签,通道,都要把它记录起来,这个TCP/IP就无法满足了!
        //所以开发出一个协议在这之上定义一些属于自己的规范,然后命名为AMQP

        //1.创建连接工程
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("127.0.0.1");
        connectionFactory.setPort(5672);
        connectionFactory.setUsername("admin");
        connectionFactory.setPassword("admin");
        //设置虚拟访问节点,是指把我们的消息发在根节点上
        connectionFactory.setVirtualHost("/");

        Connection connection = null;
        Channel channel = null;
        try {
            //2.创建连接Connection
            connection = connectionFactory.newConnection("生产者");
            //3.通过连接获取通道channel
            channel = connection.createChannel();
            //4.通过通道创建交换机,声明队列,绑定关系,路由key,发送消息和接收消息
            /**
             * @Params1 队列的名称
             * @Params2 是否要持久化durable=false,所谓的持久消息是否要存盘,false: 非持久化,true: 持久化,  思考?非持久化会存盘吗?
             * @Params3 排他性, 是否是一个独占队列
             * @Params4 是否自动删除, 随着最后一个消费者消息完毕消息以后是否把队列自动删除
             * @Params5 携带一些附加参数
             */
            String queueName = "queue1";
            //声明队列,这里就是创建队列,但是我们已经在图形化界面已经创建了所以这里就可以不用创建了
            //channel.queueDeclare(queueName, true, false, false, null);
            //5.准备发送消息内容
            String message = "Hello MQ,I is Simple";
            //6.发送消息给队列queue,
            /**
             * @Params1 :暂时为空
             * @Params2 :队列名,表示往哪个队列里面去发
             * @Params3 :发送消息过程中是否要对这里面消息进行持久化,一般这里写`MessageProperties.PERSISTENT_TEXT_PLAIN`,
             * @Params4 :发送的内容
             * 注意:这里交换机名称为空,表示走默认的交换机,默认队列和交换机绑定,所以我们暂时可以不用去绑定交换机和队列之间的关系
             */
            channel.basicPublish("", queueName, null, message.getBytes(StandardCharsets.UTF_8));

            System.out.println("消息发送成功!");

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //7.关闭通道
            if (channel != null && channel.isOpen()) {
                try {
                    channel.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            //8.关闭连接
            if (connection != null && connection.isOpen()) {
                try {
                    connection.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
